In [2]:
import requests
import json
In [3]:
response = requests.get("https://watcha.net/home/news.json?page=1&per=15")
In [5]:
# response.text => 데이터가 많이 들어있기는 하지만, str 일 뿐이다!
In [6]:
watchat_dict = json.loads(response.text) # loads => STR => DICT
In [8]:
len(watchat_dict), len(watchat_dict["news"])
Out[8]:
In [9]:
watchat_dict["news"][0]
Out[9]:
In [10]:
watchat_dict["news"][0]["title"]
Out[10]:
In [11]:
# JSON => json.loads(...), json.dumps(...)
# 1. loads => STR => DICT
# 2. dumps => DICT => STR
In [14]:
title_list = [
news["title"] #news에 대한 타이틀을 뽑으면
for news #하나의 news들에 대해서
in watchat_dict["news"]
]
updated_at_list = [
news["updated_at"]
for news
in watchat_dict["news"]
]
title_list, updated_at_list
Out[14]:
In [15]:
# 1. Firefox
# 2. pip install selenium ( conda install selenium ) => 사용자 이름이 한글로 되어있는 경우, ...,
# 가능하면 Docker 말고, 그냥 윈도우/맥에다가 설치해주세요.
In [16]:
from selenium import webdriver
In [17]:
driver = webdriver.Firefox()
In [20]:
# select ( 데이터를 찾는 기능 )
# click (클릭)
# send_keys ( 키 입력 )
# get (url 이동 )
# 이 기능들만 알고 있으면 모든 작업을 할 수 있다.
In [21]:
driver.get("http://naver.com") # .get 으로 주소 이동
In [22]:
# bs4 => select(_one)
# selenium => find_element(s)_by_css_selector
In [26]:
rank_elements = driver.find_element_by_css_selector("#realrank").find_elements_by_css_selector("a")
#a태그를 찾으면 10개가 나온다.
In [27]:
rank_element = rank_elements[0]
In [28]:
rank_element.text
Out[28]:
In [29]:
for rank_element in rank_elements:
print(rank_element.text)
In [33]:
driver.find_element_by_css_selector("#id").send_keys("kimkipoy")
In [34]:
driver.find_element_by_css_selector("#pw").send_keys("sksmssrlarlvydlqslek")
In [35]:
driver.find_element_by_css_selector(".btn_login").click()
In [36]:
from selenium import webdriver
In [37]:
driver = webdriver.Firefox()
In [38]:
# get
# find_elements_by_css_selector
# send_keys => 이번에는 안 쓰인다.
# click
# 매물을 들어가서 => 매물 연락처를 크롤링하자.
# API 를 쓰지 않습니다.
In [39]:
#스크린샷 기능
from IPython.display import Image # 해당 웹 주소 출력
Image("웹주소")
Out[39]:
In [40]:
driver.get("http://www.dabangapp.com/search#/map?id=&type=search&filters=%7B%22deposit-range%22%3A%5B0%2C999999%5D%2C%22price-range%22%3A%5B0%2C999999%5D%2C%22room-type%22%3A%5B0%2C1%2C2%2C3%2C4%2C5%5D%2C%22deal-type%22%3A%5B0%2C1%5D%2C%22location%22%3A%5B%5B126.91642697330576%2C37.52111436323831%5D%2C%5B127.07195218082529%2C37.59487095070929%5D%5D%7D&position=%7B%22center%22%3A%5B126.99418957706553%2C37.55800178295364%5D%2C%22zoom%22%3A13%7D&cluster=%7B%7D")
In [41]:
Image(driver.get_screenshot_as_base64())
Out[41]:
In [42]:
# driver.get_screenshot_as_base64() => 오래 걸린다. 긴 text가 나오는데 사실 이미지다. 가능하면 하지 마세요.
In [43]:
item_elements = driver.find_elements_by_css_selector("li.Room-item")
In [44]:
len(item_elements)
Out[44]:
In [45]:
item_element = item_elements[0]
In [46]:
a_element = item_element.find_element_by_css_selector("a")
In [47]:
a_element.get_attribute("href")
Out[47]:
In [48]:
for item_element in item_elements:
url = item_element.find_element_by_css_selector("a").get_attribute("href")
print(url)
#방 정보 url 출력
In [52]:
# 주소가 있다고 가정하고, 하나를 들어가서 핸드폰 번호 크롤링
url = "http://www.dabangapp.com/room/57b299f80f93836adc0f5c69"
driver_for_detail_page = webdriver.Firefox()
In [53]:
#웹 페이지 뜨고
driver_for_detail_page.get(url)
In [54]:
button_element = driver_for_detail_page.find_element_by_css_selector("div.contact-view-button-wrap")
button_element.click() #비공개일 경우에 클릭창이 없어서 에러가 날 수 있다.
In [55]:
driver_for_detail_page.find_element_by_css_selector(".agent-name-wrap span.number").text
Out[55]:
In [56]:
driver_for_detail_page.find_element_by_css_selector("span.number").text.split(":")[-1].strip()
Out[56]:
In [57]:
driver_for_detail_page = webdriver.Firefox()
for item_element in item_elements:
url = item_element.find_element_by_css_selector("a").get_attribute("href")
driver_for_detail_page.get(url)
# 연락처 보기 버튼 찾아서 클릭
button_element = driver_for_detail_page.find_element_by_css_selector("div.contact-view-button-wrap")
button_element.click()
# 핸드폰 번호 뽑는 녀석
phonenumber = driver_for_detail_page.find_element_by_css_selector(".agent-name-wrap span.number")\
.text.split(":")[-1]\
.strip()
print(phonenumber)
#크롤링 계속 하면 막힐 수도 있습니다... ㅠㅠ
In [60]:
# headless browser. 서버에서 돌아가게 브라우저가 안 뜨는 브라우저가 있다. 내부적으로만 뜬다.
driver = webdriver.PhantomJS()
In [61]:
driver.get("http://fastcampus.co.kr")
In [62]:
Image(driver.get_screenshot_as_base64()) #이렇게 스크린샷으로 하나하나 확인해야 한다.
Out[62]:
In [65]:
# Firefox 실험/테스트를 해보고
# 코드 => 리팩토링 => PhantomJS => 서버에서 주기적으로 돌린다.
# 만약에 자동화하고 크롤링 돌릴게 많다면 이 방법으로
In [63]:
driver.get("http://fastcampus.co.kr")
Image("http://cdn.www.fastcampus.co.kr/wp-content/uploads/2015/10/HL_fin_camp_hedgefund.png")
Image(driver.get_screenshot_as_base64()) #스크린샷을 찍어주는 기능
Out[63]:
In [64]:
from IPython.display import IFrame
IFrame("http://fastcampus.co.kr", width=400, height=300) #이 안에서 웹 주소 띄우는 것
Out[64]: